/**
 * 数据库初始化和设置脚本
 * 执行方式: node db_setup.js
 */

const mysql = require('mysql2/promise');
const dotenv = require('dotenv');
const path = require('path');
const fs = require('fs');

// 加载环境变量
dotenv.config({ path: path.join(__dirname, '.', '.env') });

// 数据库连接配置
const dbConfig = {
  host: process.env.DB_HOST || 'localhost',
  user: process.env.DB_USER || 'root',
  password: process.env.DB_PASSWORD || '',
  database: process.env.DB_NAME || 'nonghi_db',
  port: process.env.DB_PORT || 3306,
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
};

// 创建数据库和表的SQL语句
const createDatabaseSQL = `CREATE DATABASE IF NOT EXISTS \`${dbConfig.database}\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci`;

// 用户表
const createUsersTableSQL = `
CREATE TABLE IF NOT EXISTS \`users\` (
  \`id\` INT PRIMARY KEY AUTO_INCREMENT,
  \`open_id\` VARCHAR(100) NOT NULL UNIQUE COMMENT '微信openID',
  \`union_id\` VARCHAR(100) COMMENT '微信unionID',
  \`nick_name\` VARCHAR(100) COMMENT '用户昵称',
  \`avatar_url\` TEXT COMMENT '头像URL',
  \`gender\` TINYINT COMMENT '性别',
  \`country\` VARCHAR(100) COMMENT '国家',
  \`province\` VARCHAR(100) COMMENT '省份',
  \`city\` VARCHAR(100) COMMENT '城市',
  \`language\` VARCHAR(20) COMMENT '语言',
  \`last_login\` DATETIME COMMENT '最后登录时间',
  \`created_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  \`updated_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
`;

// 诊断历史记录表
const createDiagnosisHistoryTableSQL = `
CREATE TABLE IF NOT EXISTS \`diagnosis_history\` (
  \`id\` INT PRIMARY KEY AUTO_INCREMENT,
  \`user_id\` INT NOT NULL COMMENT '关联用户ID',
  \`plant_name\` VARCHAR(100) COMMENT '植物名称',
  \`latin_name\` VARCHAR(100) COMMENT '拉丁名',
  \`family\` VARCHAR(100) COMMENT '科属',
  \`image_url\` TEXT COMMENT '图片URL',
  \`diagnosis_result\` TEXT COMMENT '诊断结果',
  \`treatment\` TEXT COMMENT '治疗方法',
  \`prevention_tips\` TEXT COMMENT '预防建议',
  \`growth_advice\` TEXT COMMENT '种植建议',
  \`diagnosis_time\` DATETIME DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
`;

// 植物疾病信息表
const createPlantDiseasesTableSQL = `
CREATE TABLE IF NOT EXISTS \`plant_diseases\` (
  \`id\` INT PRIMARY KEY AUTO_INCREMENT,
  \`plant_name\` VARCHAR(100) NOT NULL COMMENT '植物名称',
  \`disease_name\` VARCHAR(255) NOT NULL COMMENT '疾病名称',
  \`symptoms\` TEXT COMMENT '症状描述',
  \`causes\` TEXT COMMENT '病因',
  \`treatment\` TEXT COMMENT '处理方法',
  \`prevention\` TEXT COMMENT '预防措施',
  \`image_url\` TEXT COMMENT '示例图片',
  \`created_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  \`updated_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  INDEX \`idx_plant_name\` (\`plant_name\`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
`;

// 示例植物疾病数据
const samplePlantDiseases = [
  {
    plant_name: '水稻',
    disease_name: '稻瘟病',
    symptoms: '叶片和茎秆上形成椭圆形或菱形的褐斑，中间灰白色，边缘褐色。严重时整个叶片枯死。',
    causes: '由稻瘟病菌(Magnaporthe grisea)引起，潮湿高温条件下易发病。',
    treatment: '1. 喷洒杀菌剂如三唑酮或咪鲜胺；2. 防治要及早进行，发病初期效果最好；3. 严重地块应连续喷药2-3次，间隔7天左右。',
    prevention: '1. 种植抗病品种；2. 均衡施肥，避免过量施用氮肥；3. 合理灌溉排水，降低田间湿度；4. 做好种子消毒处理。'
  },
  {
    plant_name: '小麦',
    disease_name: '白粉病',
    symptoms: '叶片、叶鞘、茎杆和穗上出现白色粉状物，随后变为灰白色或灰褐色，严重时整片叶子失绿枯死。',
    causes: '由小麦白粉病菌(Blumeria graminis f.sp. tritici)引起，温暖湿润环境有利于发病。',
    treatment: '1. 喷施三唑酮、腈菌唑等杀菌剂；2. 发病初期施药效果最佳；3. 按照7-10天的间隔连续防治。',
    prevention: '1. 选用抗病品种；2. 合理密植；3. 科学施肥；4. 清除田间病残体；5. 轮作倒茬。'
  },
  {
    plant_name: '玉米',
    disease_name: '茎腐病',
    symptoms: '植株下部茎基变褐，出现水浸状腐烂，轻易折断；严重时整株倒伏，影响结实。',
    causes: '主要由镰刀菌(Fusarium sp.)或细菌性茎腐病菌引起，高温高湿条件有利于发病。',
    treatment: '1. 发病初期喷洒代森锰锌或噻菌铜等杀菌剂；2. 植株倒伏后注意及时收获。',
    prevention: '1. 选用抗病品种；2. 避免连作；3. 深耕灭茬，清除病残体；4. 合理排水，避免田间积水；5. 适时收获，防止后期倒伏。'
  },
  {
    plant_name: '番茄',
    disease_name: '晚疫病',
    symptoms: '叶片出现水渍状病斑，潮湿时病斑处产生白色霉层；严重时叶片、茎干、果实均可受害，导致全株枯死。',
    causes: '由番茄晚疫病菌(Phytophthora infestans)侵染所致，适宜温度为18-24℃，高湿环境下易扩展。',
    treatment: '1. 喷施甲霜灵、百菌清或氢氧化铜等药剂；2. 发病初期每7-10天喷药一次；3. 雨后及时补药。',
    prevention: '1. 选用抗病品种；2. 轮作倒茬；3. 合理密植，保证通风良好；4. 适量施肥，避免过量氮肥；5. 雨季做好排水。'
  },
  {
    plant_name: '黄瓜',
    disease_name: '霜霉病',
    symptoms: '叶片正面出现黄色角斑，背面产生灰紫色霉层；病情严重时，叶片干枯，果实发育不良。',
    causes: '由霜霉菌(Pseudoperonospora cubensis)引起，温度15-25℃，相对湿度85%以上条件下容易发生。',
    treatment: '1. 喷施烯酰吗啉、甲霜灵等特效药剂；2. 10-14天喷药一次，雨后及时补药；3. 发病严重地块连续用药2-3次。',
    prevention: '1. 选用抗病品种；2. 大棚种植注意通风降湿；3. 合理密植和整枝；4. 避免过量灌溉；5. 发现病株及时摘除并销毁。'
  }
];

// 主函数
async function setupDatabase() {
  let connection;
  
  try {
    // 创建不含数据库名的连接
    connection = await mysql.createConnection({
      host: dbConfig.host,
      user: dbConfig.user,
      password: dbConfig.password,
      port: dbConfig.port
    });
    
    console.log('成功连接数据库服务器');

    // 创建数据库
    await connection.query(createDatabaseSQL);
    console.log(`成功创建数据库: ${dbConfig.database}`);
    
    // 切换到新数据库
    await connection.query(`USE \`${dbConfig.database}\``);
    
    // 创建用户表
    await connection.query(createUsersTableSQL);
    console.log('成功创建用户表');
    
    // 创建诊断历史记录表
    await connection.query(createDiagnosisHistoryTableSQL);
    console.log('成功创建诊断历史记录表');
    
    // 创建植物疾病信息表
    await connection.query(createPlantDiseasesTableSQL);
    console.log('成功创建植物疾病信息表');
    
    // 检查是否已有样本数据
    const [existingRows] = await connection.query('SELECT COUNT(*) as count FROM plant_diseases');
    
    if (existingRows[0].count === 0) {
      // 插入植物疾病示例数据
      for (const disease of samplePlantDiseases) {
        await connection.query(
          'INSERT INTO plant_diseases (plant_name, disease_name, symptoms, causes, treatment, prevention) VALUES (?, ?, ?, ?, ?, ?)',
          [disease.plant_name, disease.disease_name, disease.symptoms, disease.causes, disease.treatment, disease.prevention]
        );
      }
      console.log(`成功插入${samplePlantDiseases.length}条植物疾病示例数据`);
    } else {
      console.log('植物疾病表中已有数据，跳过示例数据插入');
    }
    
    console.log('数据库初始化完成！');
  } catch (err) {
    console.error('数据库设置过程中出错:', err);
    throw err;
  } finally {
    if (connection) {
      await connection.end();
      console.log('数据库连接已关闭');
    }
  }
}

// 执行设置
setupDatabase()
  .then(() => {
    console.log('数据库设置成功，程序退出');
    process.exit(0);
  })
  .catch((err) => {
    console.error('数据库设置失败:', err);
    process.exit(1);
  });
